﻿namespace CommontLibrary
{
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.IO;
    using System.Text;
    using System.Collections.Generic;
    using System.Drawing;
   
    /// <summary>
    /// Summary description for ImportExportExcel
    /// </summary>
    public class ImportExportExcel
    {
        public ImportExportExcel()
        {
            //
            // TODO: Add constructor logic here
            //
        }
        private static bool MixedData = true;
        private static bool Headers = true;
        private static string ExcelConnectionOptions()
        {
            string strOpts = "";
            if (MixedData == true)
                strOpts += "Imex=2;";
            if (Headers == true)
                strOpts += "HDR=Yes;";
            else
                strOpts += "HDR=No;";
            return strOpts;
        }
        private static string ExcelConnection(string strFile)
        {
            return @"Provider=Microsoft.Jet.OLEDB.4.0;" +
                      @"Data Source=" + strFile.Trim() + ";" +
                      @"Extended Properties=" + System.Convert.ToChar(34).ToString() +
                      @"Excel 8.0;" + ExcelConnectionOptions() +
                     System.Convert.ToChar(34).ToString();
        }


        /// <summary>
        /// Hàm này dùng để xuất dữ liệu từ Gridview ra Excel
        /// </summary>
        /// <param name="ip_grv">Gridview muốn xuất dữ liệu ra</param>
        /// <param name="ip_str_filename">Tên file excel xuất ra</param>
        /// <param name="ip_b_export_all_yn">Xuất tất cả dữ liệu hay chỉ xuất ở trang hiện tại</param>
        /// <param name="ip_i_invisible_columns">Danh sách các cột muốn ẩn đi khi xuất (lấy theo số thứ tự, bắt đầu từ 0)</param>
        public static void export_gridview_2_excel(GridView ip_grv
                                   , string ip_str_filename
                                   , params int[] ip_i_invisible_columns)
        {
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.Buffer = true;
            HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + ip_str_filename);
            HttpContext.Current.Response.Charset = "UTF-8";
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
            HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
            using (StringWriter sw = new StringWriter())
            {
                HtmlTextWriter hw = new HtmlTextWriter(sw);

                // Ẩn các cột phân trang ở cả đầu và cuối
                if (ip_grv.AllowPaging == true)
                {
                    ip_grv.TopPagerRow.Visible = false;
                    ip_grv.BottomPagerRow.Visible = false;
                }

                ip_grv.HeaderRow.BackColor = Color.White;
                ip_grv.HeaderRow.ForeColor = Color.Black;
                foreach (TableCell cell in ip_grv.HeaderRow.Cells)
                {
                    cell.BackColor = ip_grv.HeaderStyle.BackColor;
                    cell.ForeColor = ip_grv.HeaderStyle.ForeColor;
                }
                // Chỗ này để ẩn đi cột trên header
                if (ip_i_invisible_columns.Length > 0)
                {
                    for (int v_i = 0; v_i < ip_i_invisible_columns.Length; v_i++)
                    {
                        ip_grv.HeaderRow.Cells[v_i].Visible = false;
                    }
                }

                foreach (GridViewRow row in ip_grv.Rows)
                {
                    // Chỗ này để ẩn đi cột trên các dòng dữ liệu
                    if (ip_i_invisible_columns.Length > 0)
                    {
                        for (int v_i = 0; v_i < ip_i_invisible_columns.Length; v_i++)
                        {
                            row.Cells[v_i].Visible = false;
                        }
                    }

                    row.BackColor = Color.White;
                    foreach (TableCell cell in row.Cells)
                    {
                        if (row.RowIndex % 2 == 0)
                        {
                            cell.BackColor = ip_grv.AlternatingRowStyle.BackColor;
                        }
                        else
                        {
                            cell.BackColor = ip_grv.RowStyle.BackColor;
                        }
                        cell.CssClass = "textmode";

                        List<Control> controls = new List<Control>();

                        //Add controls to be removed to Generic List
                        foreach (Control control in cell.Controls)
                        {
                            switch (control.GetType().Name)
                            {
                                case "HyperLink":
                                    cell.Controls.Remove(control);
                                    break;
                                case "TextBox":
                                    break;
                                case "LinkButton":
                                    cell.Controls.Remove(control);
                                    break;
                                case "CheckBox":
                                    cell.Controls.Remove(control);
                                    break;
                                case "RadioButton":
                                    cell.Controls.Remove(control);
                                    break;
                            }
                        }
                    }
                } 
                ip_grv.RenderControl(hw);
                //style to format numbers to string
                string style = @"<style> .textmode { mso-number-format:\@; } </style>";
                HttpContext.Current.Response.Write(style);
                HttpContext.Current.Response.Output.Write(sw.ToString());
                HttpContext.Current.Response.Flush();
                HttpContext.Current.Response.End();
            }
        }

    }
}